package jmine.tec.utils.date;

import bancosys.tec.utils.date.Timestamp;

/**
 * Agregador de intervalos de tempo.
 * 
 * @author Marcio Ribeiro (mmr)
 * @created Dec 9, 2011
 */
public class IntervalAggregator {
    private int intervalsAdded;

    private long maxTime;

    private long minTime;

    private long times;

    /**
     * Construtor.
     */
    public IntervalAggregator() {
        // do nothing
    }

    /**
     * Construtor conveniente para criacao de agregador ja com itens vindos de busca.
     * 
     * @param intervals iteravel com intervalos para adicionar.
     */
    public IntervalAggregator(Iterable<Interval> intervals) {
        for (Interval interval : intervals) {
            this.addInterval(interval);
        }
    }

    /**
     * Adiciona intervalo ao agregador.
     * 
     * @param start inicio do intervalo.
     * @param end fim do intervalo.
     */
    public void addInterval(long start, long end) {
        this.addInterval(new Interval(start, end));
    }

    /**
     * Adiciona intervalo ao agregador.
     * 
     * @param start inicio do intervalo.
     * @param end fim do intervalo.
     */
    public void addInterval(Timestamp start, Timestamp end) {
        this.addInterval(new Interval(start, end));
    }

    /**
     * Adiciona um intervalo ao agregador.
     * 
     * @param interval intervalo a ser adicionado.
     */
    public synchronized void addInterval(Interval interval) {
        long time = interval.getInterval();

        if (time > this.maxTime) {
            this.maxTime = time;
        }
        if (this.minTime == 0 || time < this.minTime) {
            this.minTime = time;
        }
        this.times += time;
        this.intervalsAdded++;
    }

    /**
     * @return numero de deltas.
     */
    public int getIntervalsAdded() {
        return this.intervalsAdded;
    }

    /**
     * @return tempo medio.
     */
    public double getAvgTime() {
        if (this.intervalsAdded == 0) {
            return 0;
        }
        return (double) this.times / this.intervalsAdded;
    }

    /**
     * @return the maxTime
     */
    public long getMaxTime() {
        return maxTime;
    }

    /**
     * @return the minTime
     */
    public long getMinTime() {
        return minTime;
    }
}
